package com.baozhun.mall.common.util

import com.blankj.utilcode.util.StringUtils
import java.math.BigDecimal
import java.math.RoundingMode

/**
 * @Title：金额格式化工具类
 * @Description：
 * @Author：xuefeng.zhu
 * @Since：2023/5/24
 * @Version：1.0.0
 */
object MoneyUtils {
    /**
     * 金额格式化：
     * 1）如有小数点，精确到小数点后2位，四舍五入；
     * 2） 没小数点，按整数显示；
     * 3）整数部分超过3位的，每三位用半角逗号分割
     *
     * @param amount
     * @return
     */
    fun convert(amount: String): String? {
        var amount = amount
        if (StringUtils.isEmpty(amount)) {
            return ""
        }
        return if (amount.contains(".")) {
            //先四舍五入，避免进位取整
            amount = rounding(amount)
            if (amount.contains(".")) {
                val addCommaStr = amount.substring(0, amount.indexOf("."))
                val tmpCommaStr = amount.substring(amount.indexOf("."))
                addComma(addCommaStr) + tmpCommaStr
            } else {
                addComma(amount)
            }
        } else {
            addComma(amount)
        }
    }

    /**
     * 科学计数法处理，每三位用半角逗号分割
     *
     * @param amount
     * @return
     */
    private fun addComma(amount: String?): String {
        val reverseStr = StringBuilder(amount!!).reverse().toString()
        var strTemp = ""
        for (i in reverseStr.indices) {
            if (i * 3 + 3 > reverseStr.length) {
                strTemp += reverseStr.substring(i * 3, reverseStr.length)
                break
            }
            strTemp += reverseStr.substring(i * 3, i * 3 + 3) + ","
        }
        if (strTemp.endsWith(",")) {
            strTemp = strTemp.substring(0, strTemp.length - 1)
        }
        return StringBuilder(strTemp).reverse().toString()
    }

    /**
     * 四舍五入处理，保留两位小数（.00小数位除外）
     *
     * @param amount
     * @return
     */
    fun rounding(amount: String?): String {
        var num1 = BigDecimal(amount)
        num1 = num1.setScale(2, RoundingMode.HALF_UP)
        val num2 = num1.setScale(0, RoundingMode.DOWN)
        //如果带小数跟取整相同，则取整，去掉.00小数位
        return num1.toString()
//        return if (num1.compareTo(num2) == 0) {
//            num2.toString()
//        } else num1.toString()
    }

    @JvmStatic
    fun main(args: Array<String>) {
        println("无小数位：" + convert("321321415"))
        println("小数进位取整：" + convert("321321415.995"))
        println("小数保留两位：" + convert("321321415.994"))
    }
}